/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;

import java.io.Serializable;

/**
 * Class Segment
 * 
 * Représentation d'un Segment
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class Segment extends ElementGeo implements Serializable{

     /**
     * Attribut de la classe Segment
     */
    private Point a;
    private Point b;
    
    /**
     * Constructeur par defaut de Segment
     */
    public Segment(){
        this.a = null;
        this.b = null;
    }
    /**
     * Surcharge du constructeur de Segment
     * @param a - Point a du segment
     */
    public Segment(Point a){
        this.a = a.createClone();
        this.b = null;
    }
    /**
     * Surcharge du constructeur de segement
     * @param a - Point a du segment
     * @param b - Point b du segment
     */
    public Segment(Point a,Point b){
        this.a = a.createClone();
        this.b = b.createClone();
    }
    
    /**
     * Creer un clone de segment
     * @return clone de segment
     */
    @Override
    public Segment createClone(){
        return new Segment(this.a,this.b);
    }
    /**
     * Creer la symétrie du segment
     * @return symetrie du segment
     */
    @Override
    public Segment createSymetrie(){
       return new Segment(this.a.createSymetrie(),this.b.createSymetrie());
    }
    /**
     *Equals compare deux segment
     *@param obj - segment à comparer 
     */
    @Override
    public boolean equals(Object obj) {
        return (this.a.equals(((Segment)obj).getA())
                && (this.b.equals(((Segment)obj).getB())));
    }
    /**
     * Get Point a du Segment
     *@return a 
     */
    public Point getA() {
        return a;
    }
    /**
     *Set Point a du Segment
     *@param a 
     */
    public void setA(Point a) {
        this.a = a;
    }
    /**
     * Get Point b du Segment
     *@return b 
     */
    public Point getB() {
        return b;
    }
    /**
     *Set Point b du Segment
     *@param b 
     */
    public void setB(Point b) {
        this.b = b;
    }
    /**
     *Override de toString
     *@return les valeurs du point a et b
     */
    @Override
        public String toString() {
        return "Segment{ Point a=" + this.a + ", point b=" + this.b+"}";
    }
     /**
     * isPointOver vérifie si un point est contenu dans la forme géométrique
     *@param click - point
     *@param marge - marge d'erreur
     */
    @Override
    public boolean isPointOver(Point click, int marge) {
         return (this.a.distance(b)<(this.a.distance(click)+this.b.distance(click))+marge) &&
            (this.a.distance(b)>=(this.a.distance(click)+this.b.distance(click))-marge);
    }
    /**
     * translateTo déplace la forme géométrique
     *@param diffX - déplacement en X
     *@param diffY - déplacement en Y
     */
    @Override
    public void translateTo(int diffX, int diffY) {
        this.a.setX(this.a.getX()+diffX);
        this.a.setY(this.a.getY()+diffY);        
        this.b.setX(this.b.getX()+diffX);
        this.b.setY(this.b.getY()+diffY);
    }
    /**
     * Fait la symetrie par rapport à l'origine
     * @param o - origine
     */
    @Override
    public void symetrieO(Point o){
        this.a.setX( o.getX() -(this.a.getX()-o.getX()));
        this.a.setY( o.getY() -(this.a.getY()-o.getY()));
        this.b.setX( o.getX() -(this.b.getX()-o.getX()));
        this.b.setY( o.getY() -(this.b.getY()-o.getY()));
    }
    /**
     * Fait la symetrie par rapport à X
     * @param o - origine
     */
    @Override
    public void symetrieX(Point o){
        this.a.setY( o.getY() -(this.a.getY()-o.getY()));
        this.b.setY( o.getY() -(this.b.getY()-o.getY()));
    }
    /**
     * Fait la symetrie par rapport à Y
     * @param o - origine
     */
    @Override
    public void symetrieY(Point o){
        this.a.setX( o.getX() -(this.a.getX()-o.getX()));
        this.b.setX( o.getX() -(this.b.getX()-o.getX()));
    }  
}
